package zdori;

public class J26_TypeCasting {

	/**
	 * @param args
	 * 
	 * 모든 클래스의 조상
	 * 모든 클래스는 자동적으로 java.lang.Object 를 확장함
	 * 즉 Object 클래스는 자바에서 궁극의 super 클래스임
	 * 
	 * 기본적으로 Object 클래스에는 7개의 메서드가 정의 되어 있고 하위 클래스에서는 이것을 재정의해서 직접 사용가능
	 * 
	 * equals
	 * 기존 객체와 매개변수로 전달된 객체와 비교
	 * 객체 비교가 제대로 이뤄질려면 메서드를 재정의하고 구현해야 함
	 * 
	 * hashcode
	 * 객체의 해시코드를 출력함
	 * 객체는 일반적으로 heap 에 생성됨 heap 에 생성된 객체의 메모리 주소를 바탕으로 만들어지는 유일한 코드값을 의미
	 * toString
	 * 객체에 대한 설명을 출력함
	 * 
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object obj = new Object();
		
		J25_Animal a = new J25_Animal();
		J25_Fish f = new J25_Fish();
		
		//a = new J25_Fish();
		//a = f;
		//fish 는 animal을 확장했기 때문에 animal 형의객체를 받을 수 있음
		//하위 객체를 상위 객체로 cast 하는 경우
		//이것을 upcasting 이라 함
		
		//f = (J25_Fish)new J25_Animal();
		//상위 객체를 하위 객체로 cast 하는경우 
		//이것을 downcasting 이라 함
		//이때 명시적으로 괄호 안에 cast 함
		//클래스 자료형을 명시
		
		//다형성 polymorphism
		//OPP 중요 개념중 하나 특정 유형의 프로그래밍 요소(변수)가 상황에 따라 다양한 유형의 요소로 바뀔 수 있는 특성을 의미
		//주로 상속관계에 있는 클래스 간에서 나타나는 특별한 성질
		
		//is-a 관계확인
		//특정 객체가 어떤 유형과 동일한지 또는 상속관계 인지 알아볼 때 
		//instancefo 예약어를 사용
		
		/*TerranUnit tu = new TerranUnit();
		Marine mr = new Marine();
		Firebat fb = new Firebat();
		Medic md = new Medic();*/
		
		//다형성을 근거로 테란 유닛 생산(upcasting)
		//즉 마린 유닛은 상황에 따라 테란유닛도 될 수 있다는 의미
		TerranUnit mr = new Marine();//upcasting
		mr.sayUnit();
		mr.sayUnit((Marine)mr);//downcasting
		TerranUnit fb = new Firebat();
		fb.sayUnit();
		fb.sayUnit((Firebat)fb);
		TerranUnit md = new Medic();
		md.sayUnit();
		md.sayUnit((Medic)md);
		
		AllianceUnit a1 = new Human();
		AllianceUnit a2 = new Wolf();
		AllianceUnit a3 = new Nom();
		
		J26_TypeCasting t = new J26_TypeCasting();
		if(t instanceof java.lang.Object){
			System.out.println("t 는 Object 자손");
		}
		if(mr instanceof TerranUnit){//is-a
			System.out.println("해병은 테란유닛 자손");
		}
		if(mr instanceof Marine){//동질성
			System.out.println("mr 은 해병임");
		}
	}
	
	
}

//TerranUnit - Marine,Firebat,Medic

//게임 내에서 Marine, Firebat, Medic 를 생산하는 경우

class TerranUnit{
	
	public void sayUnit(){
		System.out.println("나 테란 유닛");
	}

	public void sayUnit(Marine mr) {
		System.out.println("나 마린");
	}
	
	public void sayUnit(Firebat fb) {
		System.out.println("나 파이어뱃");
	}
	
	public void sayUnit(Medic md) {
		System.out.println("나 메딕");
	}
}

class Marine extends TerranUnit{
	/*@Override
	public void sayUnit() {
		// TODO Auto-generated method stub
		//super.sayUnit();
		//System.out.println("나 마린");
	}*/
}

class Firebat extends TerranUnit{
	/*@Override
	public void sayUnit() {
		// TODO Auto-generated method stub
		//System.out.println("나 파이어뱃");
	}*/
}

class Medic extends TerranUnit{
	/*@Override
	public void sayUnit() {
		// TODO Auto-generated method stub
		//System.out.println("나 메딕");
	}*/
}

class AllianceUnit{
	
}

class Human extends AllianceUnit{
	
}

class Wolf extends AllianceUnit{
	
}

class Nom extends AllianceUnit{
	
}
